<?php

class KardexAlumno {
  /**
   * Numero de cuenta
   * @var string
   */
  var $strNumCta       ;
  
  /**
   * Apellido Paterno
   * @var string
   */
  var $strApPat        ;
  
  /**
   * Apellido Materno
   * @var string
   */
  var $strApMat        ;
  
  /**
   * Nombre del alumno
   * @var string
   */
  var $strNombre       ;
  
  /**
   * Clave de la carrera
   * @var int
   */
  var $intClaveCarrera ;
  
  /**
   * Año de ingreso
   * @var string
   */
  var $intAnioIngreso  ;
  
  /**
   * Clave del Plan de Estudios
   * @var int
   */
  var $intClavePEST    ;
  
  /**
   * Nombre de la Carrera
   * @var string
   */
  var $strNombreCarrera;
  
  /**
   * Nombre de la base de datos a consultar
   * @var string
   */
  var $strNombreBase   ;
  
  /**
   * Numero de materias aprobadas (Con mas de 5 de Calificacion)
   * @var int
   */
  var $intMateriasAprobadas     ;
  /**
   * Numero de materias reporbadas (Con 5 o menos, o con NP, NA, Etc.)
   * @var int
   */
  var $intMateriasReprobadas    ;
  /**
   * Numero de materias presentadas (Aprobadas + Reprobadas sin contar los NP, NA)
   * @var int
   */
  var $intMateriasPresentadas   ;
  /**
   * Suma de las calificaciones (Solo se toman en cuenta las materias presentadas)
   * @var int
   */
  var $intSumaCalificacion      ;
  /**
   * Promedio general (SumaCalificacion / MateriasPresentadas)
   * @var float
   */
  var $fltPromedio              ;
  /**
   * Total de creditos necesarios para pasar OBLIGATORIOS
   * @var int
   */
  var $intCredObligatoriosTot   ;
  /**
   * Avance de creditos
   * @var int
   */
  var $intCredObligatoriosAvance;
  
  /**
   * Plan de Estudios
   * @var KA_PlanEstudios
   */
  var $oPlanEstudios;
  
  /**
   * @var ConectaP
   */
  var $oConecta;
  
  /**
   * Arreglo con los ciclos. Todavia no lo entiendo completamente bien
   * @var array
   */
  var $arrCiclos;
  
  /**
   * Arreglo con los nombres de las asignaturas.
   * @var array
   */
  var $arrNombresAsig;
  
  /**
   * Arreglo con las claves de las asignaturas.
   * @var array
   */
  var $arrClavesAsig;
  
  /**
   * Arreglo con los creditos de las asignaturas.
   * @var array
   */
  var $arrCreditosAsig;
  
  /**
   * Arreglo de calificaciones
   * @var array
   */
  var $arrCalificaciones;
  
  /**
   * Historia Academica
   * @var string
   */
  var $strHistoriaAcademica;
  
  /**
   * Cabecera del alumno
   * @var string
   */
  var $strCabeceraAlumno;
  
  function KardexAlumno($strNumCta, $strNombreBase) {
    $this->strNumCta     = $strNumCta    ;
    $this->strNombreBase = $strNombreBase;
    
    $this->oConecta = new ConectaP("", $this->strNombreBase);
    $this->__ObtenerDatosAlumno();
    $this->oPlanEstudios = new KA_PlanEstudios($this->intClavePEST, $this->oConecta);
    
    $this->ObtenerCiclos        (); // Esta se debe de llamar ANTES de obtener los promedios y las calificaciones
    $this->ObtenerCalificaciones(); // Esta se debe de llamar ANTES de obtener los promedios y las calificaciones
    $this->ObtenerPromedios     (); // Aqui tambien se obtiene la historia academica en la variable $strHistoriaAcademica
    $this->ObtenerCabeceraAlumno(); // Aqui tambien se obtiene la historia academica en la variable $strHistoriaAcademica
  }
  
  function ObtenerCiclos() {
    $strConsulta = "SELECT * FROM asignaturas_por_ciclo WHERE pest_clave = {$this->intClavePEST}";
    $this->oConecta->Consulta($strConsulta);
    
    $arrTmpCiclos = $this->oConecta->GetCompleteRes();
    $this->intCredObligatoriosTot = 0;
    foreach($arrTmpCiclos as $arrCiclo) {
      $strConsulta  = "";
      $strConsulta .= "SELECT ";
      $strConsulta .= "  asg.asg_id    , ";
      $strConsulta .= "  asg.asg_clave , ";
      $strConsulta .= "  asg.asg_nombre, ";
      $strConsulta .= "  asg_creditos    ";
      $strConsulta .= "FROM asignatura AS asg ";
      $strConsulta .= "JOIN asignatura_plan USING(asg_id) ";
      $strConsulta .= "WHERE asignatura_plan.pest_clave = {$this->intClavePEST} ";
      
      if(
        ($this->intClavePEST == 1247) || 
        ($this->intClavePEST == 1248) || 
        ($this->intClavePEST == 1249) || 
        ($this->intClavePEST == 1250) || 
        ($this->intClavePEST == 1251)
      ) {
        $strConsulta .= "AND asg_semestre_anio in (0, 7, 8) ";
        $strConsulta .= "AND (";
        $strConsulta .= "  (asg_clave IN (1713, 1715, 1716, 1714, 1813, 1817, 1819, 1815, 1814, 1818, 1820, 1816)) ";
        $strConsulta .= "  OR (asg_clave LIKE '10%')";
        $strConsulta .= ")";
      } else {
        $strConsulta .= "AND asg_semestre_anio = {$arrCiclo["aporc_ciclo"]} ";
        $strConsulta .= "AND asg_clave NOT IN ( ";
        $strConsulta .= "  1713, 1715, 1716, 1714, 1813, 1817, 1819, 1815, 1814, 1818, 1820, 1816 ";
        $strConsulta .= ") ";
      }
      
      $this->oConecta->Consulta($strConsulta);
      
      $k = 1;
      while(!$this->oConecta->EOF) {
        $this->arrCiclos[$arrCiclo["aporc_ciclo"]][$k++] = $this->oConecta->Field('asg_id');
        $this->arrNombresAsig [$this->oConecta->Field('asg_id')] = $this->oConecta->Field('asg_nombre'  );
        $this->arrCreditosAsig[$this->oConecta->Field('asg_id')] = $this->oConecta->Field('asg_creditos');
        $this->arrClavesAsig  [$this->oConecta->Field('asg_id')] = $this->oConecta->Field('asg_clave'   );
        
        $this->intCredObligatoriosTot += $this->oConecta->Field('asg_creditos');
        
        $this->oConecta->MoveNext();
      }
    }
  }
  
  function ObtenerCalificaciones() {
    // Calificaciones del historial
    $strConsulta  = "";
    $strConsulta .= "SELECT ";
    $strConsulta .= "  DISTINCT(hi.act_folio), ";
    $strConsulta .= "  hi.hst_calificacion, ";
    $strConsulta .= "  hi.asg_id, ";
    $strConsulta .= "  ac.prd_id, ";
    $strConsulta .= "  ac.act_tipo_examen ";
    $strConsulta .= "FROM historial AS hi ";
    $strConsulta .= "JOIN acta AS ac USING(act_folio, asg_id, pest_clave) ";
    $strConsulta .= "WHERE alm_numero_cuenta = {$this->strNumCta} ";
    $strConsulta .= "AND ac.pest_clave = {$this->intClavePEST} ";
    $strConsulta .= "ORDER BY hi.asg_id, ac.prd_id ";
    $this->oConecta->Consulta($strConsulta);
    while(!$this->oConecta->EOF) {
      $strCalif  = "";
      $strCalif .= $this->oConecta->Field('asg_id') . ":::";
      $strCalif .= $this->oConecta->Field('prd_id') . ":::";
      $strCalif .= $this->oConecta->Field('hst_calificacion') . ":::";
      $strCalif .= $this->oConecta->Field('act_tipo_examen');
      $this->arrCalificaciones[$this->oConecta->Field('asg_id')][] = $strCalif;
      $this->oConecta->MoveNext();
    }
    
    // Calificaciones de actas
    $strConsulta  = "";
    $strConsulta .= "SELECT ";
    $strConsulta .= "  DISTINCT(hi.act_folio), ";
    $strConsulta .= "  hi.aalm_calificacion, ";
    $strConsulta .= "  hi.asg_id, ";
    $strConsulta .= "  ac.prd_id, ";
    $strConsulta .= "  ac.act_tipo_examen ";
    $strConsulta .= "FROM acta_alumno AS hi ";
    $strConsulta .= "JOIN acta AS ac USING(act_folio) ";
    $strConsulta .= "WHERE alm_numero_cuenta = {$this->strNumCta} ";
    $strConsulta .= "AND ac.pest_clave = {$this->intClavePEST} ";
    $strConsulta .= "ORDER BY hi.asg_id, ac.prd_id ";
    $this->oConecta->Consulta($strConsulta);
    while(!$this->oConecta->EOF) {
      $strCalif  = "";
      $strCalif .= $this->oConecta->Field('asg_id') . ":::";
      $strCalif .= $this->oConecta->Field('prd_id') . ":::";
      $strCalif .= $this->oConecta->Field('aalm_calificacion') . ":::";
      $strCalif .= $this->oConecta->Field('act_tipo_examen');
      $this->arrCalificaciones[$this->oConecta->Field('asg_id')][] = $strCalif;
      $this->oConecta->MoveNext();
    }
    
    // Ordenar las calificaciones
    Ksort($this->arrCalificaciones);
    reset($this->arrCalificaciones);
  }
  
  function ObtenerPromedios() {
    // Obtener promedio
    $arrConversion = array(
      "RE" => "06", "AC" => "06", "CO" => "06", "NP" => "05", 
      "NA" => "05", "S"  => "06", "B"  => "08", "MB" => "10", 
      "05" => "05", "06" => "06", "07" => "07", "08" => "08", 
      "09" => "09", "10" => "10", "5"  => "05", "6"  => "06", 
      "7"  => "07", "8"  => "08", "9"  => "09"
    );
    
    $arrSemestres = array(
      1 => "PRIMER" , 2 => "SEGUNDO", 3 => "TERCER" , 
      4 => "CUARTO" , 5 => "QUINTO" , 6 => "SEXTO"  ,
      7 => "SEPTIMO", 8 => "OCTAVO" , 9 => "NOVENO"
    );
    
    switch($this->intClavePEST) {
      case 1247:
        $arrSemestres[7] = "OPTATIVAS";
        unset($arrSemestres[8]);
        unset($arrSemestres[9]);
        break;
      case 1248: case 1249: case 1250: case 1251:
        $arrSemestres[9] = "OPTATIVAS";
        break;
    }
    
    if($this->oPlanEstudios->strPESTPlan == "A") {
      $strSemAnio = "A&Ntilde;O";
    } else if ($this->oPlanEstudios->strPESTPlan == 'S') {
      $strSemAnio = "SEMESTRE";
    }
    
    $this->strHistoriaAcademica  = "";
    $this->strHistoriaAcademica .= "<table class='TablaReportes' width='100%'>";
    $this->strHistoriaAcademica .= "<tr><th colspan='6'>FALTA TOMAR EN CUENTA OPTATIVAS</th></tr>";
    $this->strHistoriaAcademica .= "<tr>";
    $this->strHistoriaAcademica .= "<th>CLAVE</th>";
    $this->strHistoriaAcademica .= "<th>ASIGNATURA</th>";
    $this->strHistoriaAcademica .= "<th>CR&Eacute;DITOS</th>";
    $this->strHistoriaAcademica .= "<th>CALIFICACI&Oacute;N</th>";
    $this->strHistoriaAcademica .= "<th>PERIODO</th>";
    $this->strHistoriaAcademica .= "<th>TIPO</th>";
    $this->strHistoriaAcademica .= "</tr>";
    
    $this->intMateriasAprobadas      = 0;
    $this->intMateriasReprobadas     = 0;
    $this->intMateriasPresentadas    = 0;
    $this->intSumaCalificacion       = 0;
    $this->fltPromedio               = 0;
    $this->intCredObligatoriosAvance = 0;
    foreach($this->arrCiclos as $intNumCiclo => $arrInfoCiclo) {
      $bolCabeceraCicloPuesta = false;
      foreach($arrInfoCiclo as $intNumMateria => $intIdMateria) {
        if(isset($this->arrCalificaciones[$intIdMateria])) {
          // Revizamos si ya se puso la cabecera de este ciclo
          if(!$bolCabeceraCicloPuesta) {
            $this->strHistoriaAcademica .= "<tr><th colspan='6'>";
            // Si el ciclo es el de las optativas, NO se muestra lo de AÑO o SEMESTRE
            if($arrSemestres[$intNumCiclo] == "OPTATIVAS") {
              $this->strHistoriaAcademica .= "{$arrSemestres[$intNumCiclo]}";
            } else {
              $this->strHistoriaAcademica .= "{$arrSemestres[$intNumCiclo]} {$strSemAnio}";
            }
            $this->strHistoriaAcademica .= "</th></tr>";
            $bolCabeceraCicloPuesta = true;
          }
          
          foreach($this->arrCalificaciones[$intIdMateria] as $intIndMat => $strInfoMateria) {
            list($strDummy, $strPeriodo, $strCalificacion, $strTipoPeriodo) = explode(":::", $strInfoMateria);
            
            // Del periodo solo se necesitan los primeros 5 digitos
            $strPeriodo = substr($strPeriodo, 0, 5);
            
            $this->strHistoriaAcademica .= "<tr " . Variables::AlternarConClase() . ">";
            $this->strHistoriaAcademica .= "<td>{$this->arrClavesAsig  [$intIdMateria]}</td>";
            $this->strHistoriaAcademica .= "<td>{$this->arrNombresAsig [$intIdMateria]}</td>";
            $this->strHistoriaAcademica .= "<td class='AlinearDerecha'>{$this->arrCreditosAsig[$intIdMateria]}</td>";
            $this->strHistoriaAcademica .= "<td class='AlinearDerecha'>{$strCalificacion}</td>";
            $this->strHistoriaAcademica .= "<td class='AlinearDerecha'>{$strPeriodo}</td>";
            $this->strHistoriaAcademica .= "<td class='AlinearDerecha'>{$strTipoPeriodo}</td>";
            $this->strHistoriaAcademica .= "</tr>";
            
            if(($intIndMat + 1) == count($this->arrCalificaciones[$intIdMateria])) {
              // Es la ultima materia, por lo que esa es la que juega para promedios
              if(($strCalificacion != "NP") && ($strCalificacion != "NA")) {
                $this->intMateriasPresentadas++;
                $this->intSumaCalificacion += $arrConversion[$strCalificacion];
              }
              if($arrConversion[$strCalificacion] > 5) {
                $this->intMateriasAprobadas++;
                $this->intCredObligatoriosAvance += $this->arrCreditosAsig[$intIdMateria];
              } else {
                $this->intMateriasReprobadas++;
              }
            }
          }
        }
      }
    }
    
    $this->strHistoriaAcademica .= "</table>";
    
    if($this->intMateriasPresentadas != 0) {
      $this->fltPromedio = $this->intSumaCalificacion / $this->intMateriasPresentadas;
    }
  }
  
  function ObtenerCabeceraAlumno() {
    $this->strCabeceraAlumno  = "";
    $this->strCabeceraAlumno .= "<table class='TablaReportes' width='100%'>";
    $this->strCabeceraAlumno .= "<tr><td><table width='100%'>";
    $this->strCabeceraAlumno .= "<tr>";
    $this->strCabeceraAlumno .= "<td>N&uacute;mero de cuenta: <b>{$this->strNumCta}</b></td>";
    $this->strCabeceraAlumno .= "<td rowspan='2'>Nombre: <b>{$this->strApPat} {$this->strApMat} {$this->strNombre}</b></td>";
    $this->strCabeceraAlumno .= "<td>A&ntilde;o de ingreso: <b>{$this->intAnioIngreso}</b></td>";
    $this->strCabeceraAlumno .= "</tr>";
    $this->strCabeceraAlumno .= "<tr>";
    $this->strCabeceraAlumno .= "<td>Carrera: <b>{$this->strNombreCarrera} ({$this->intClaveCarrera})</b></td>";
    $this->strCabeceraAlumno .= "<td>Plan de Estudios: <b>{$this->intClavePEST}</b></td>";
    $this->strCabeceraAlumno .= "</tr>";
    $this->strCabeceraAlumno .= "</table></td></tr>";
    $this->strCabeceraAlumno .= "<tr><th><hr /></th></tr>";
    $this->strCabeceraAlumno .= "<tr><td><table width='100%'>";
    $this->strCabeceraAlumno .= "<tr>";
    $this->strCabeceraAlumno .= "<th>Avance de Creditos</th>";
    $this->strCabeceraAlumno .= "<th>Asignaturas</th>";
    $this->strCabeceraAlumno .= "<th>Promedio</th>";
    $this->strCabeceraAlumno .= "</tr>";
    $this->strCabeceraAlumno .= "<tr>";
    $this->strCabeceraAlumno .= "<td>";
    $this->strCabeceraAlumno .= "Obligatorios: ";
    $this->strCabeceraAlumno .= "<b>{$this->intCredObligatoriosAvance} ";
    $this->strCabeceraAlumno .= "de {$this->intCredObligatoriosTot} ";
    $this->strCabeceraAlumno .= "(" . Variables::FormatoNumero($this->intCredObligatoriosAvance * 100 / $this->intCredObligatoriosTot) . " %)</b>";
    $this->strCabeceraAlumno .= "</td>";
    $this->strCabeceraAlumno .= "<td>";
    $this->strCabeceraAlumno .= "Aprobadas: <b>{$this->intMateriasAprobadas}</b><br />";
    $this->strCabeceraAlumno .= "Reprobadas: <b>{$this->intMateriasReprobadas}</b><br />";
    $this->strCabeceraAlumno .= "Total: <b>" . ($this->intMateriasAprobadas + $this->intMateriasReprobadas) . "</b>";
    $this->strCabeceraAlumno .= "</td>";
    $this->strCabeceraAlumno .= "<td><b>" . Variables::FormatoNumero($this->fltPromedio) . "</b></td>";
    $this->strCabeceraAlumno .= "</tr>";
    $this->strCabeceraAlumno .= "</table></td></tr>";
    $this->strCabeceraAlumno .= "</table>";
  }
  
  function ObtenerHTMLHistorialCompleto() {
    $strRes  = "";
    $strRes .= "<table>";
    $strRes .= "<tr><td>{$this->strCabeceraAlumno}</td></tr>";
    $strRes .= "<tr><td>{$this->strHistoriaAcademica}</td></tr>";
    $strRes .= "</table>";
    
    return $strRes;
  }
  
  function __ObtenerDatosAlumno() {
    $strConsulta  = "";
    $strConsulta .= "SELECT ";
    $strConsulta .= "  a.alm_ap_pat        , ";
    $strConsulta .= "  a.alm_ap_mat        , ";
    $strConsulta .= "  a.alm_nombre        , ";
    $strConsulta .= "  ac.crr_clave        , ";
    $strConsulta .= "  ac.acrr_anio_ingreso, ";
    $strConsulta .= "  ac.pest_clave       , ";
    $strConsulta .= "  c.crr_nombre          ";
    $strConsulta .= "FROM ";
    $strConsulta .= "  alumno         AS a , ";
    $strConsulta .= "  alumno_carrera AS ac, ";
    $strConsulta .= "  carrera        AS c   ";
    $strConsulta .= "WHERE ";
    $strConsulta .= "  a.alm_numero_cuenta     = ac.alm_numero_cuenta ";
    $strConsulta .= "  AND ac.crr_clave        = c.crr_clave          ";
    $strConsulta .= "  AND a.alm_numero_cuenta = {$this->strNumCta}   ";
    
    $this->oConecta->Consulta($strConsulta);
    $this->strApPat         = $this->oConecta->Field('alm_ap_pat'       );
    $this->strApMat         = $this->oConecta->Field('alm_ap_mat'       );
    $this->strNombre        = $this->oConecta->Field('alm_nombre'       );
    $this->intClaveCarrera  = $this->oConecta->Field('crr_clave'        );
    $this->intAnioIngreso   = $this->oConecta->Field('acrr_anio_ingreso');
    $this->intClavePEST     = $this->oConecta->Field('pest_clave'       );
    $this->strNombreCarrera = $this->oConecta->Field('crr_nombre'       );
  }
}

class KA_PlanEstudios {
  var $intPESTClave        ;
  var $intClaveCarrera     ;
  var $strPESTNombreEspec  ;
  var $strPESTNivel        ;
  var $strPESTSistema      ;
  var $intPESTPrimeraGener ;
  var $strPESTPlan         ;
  var $intPESTDuracion     ;
  var $intPESTCreditosOblig;
  var $intPESTCreditosOptat;
  var $intPESTVigencia     ;
  var $intPESTTipoPrograma ;
  var $intPESTNumeroAsig   ;
  var $intPESTTipoSeriacion;
  
  /**
   * @param int          $intPESTClave Clave del plan de estudios
   * @param Conecta_Base $oConecta     Conexion a la base de datos
   */
  function KA_PlanEstudios($intPESTClave, $oConecta) {
    $strConsulta = "SELECT * FROM plan_estudios WHERE pest_clave = {$intPESTClave}";
    $oConecta->Consulta($strConsulta);
    
    $this->intPESTClave         = $oConecta->Field('pest_clave'         );
    $this->intClaveCarrera      = $oConecta->Field('crr_clave'          );
    $this->strPESTNombreEspec   = $oConecta->Field('pest_nombre_espec'  );
    $this->strPESTNivel         = $oConecta->Field('pest_nivel'         );
    $this->strPESTSistema       = $oConecta->Field('pest_sistema'       );
    $this->intPESTPrimeraGener  = $oConecta->Field('pest_primera_gener' );
    $this->strPESTPlan          = $oConecta->Field('pest_plan'          );
    $this->intPESTDuracion      = $oConecta->Field('pest_duracion'      );
    $this->intPESTCreditosOblig = $oConecta->Field('pest_creditos_oblig');
    $this->intPESTCreditosOptat = $oConecta->Field('pest_creditos_optat');
    $this->intPESTVigencia      = $oConecta->Field('pest_vigencia'      );
    $this->intPESTTipoPrograma  = $oConecta->Field('pest_tipo_programa' );
    $this->intPESTNumeroAsig    = $oConecta->Field('pest_numero_asig'   );
    $this->intPESTTipoSeriacion = $oConecta->Field('pest_tipo_seriacion');
  }
}

?>